
#include "MatrixKey.h"


void MK_Init(){
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_7;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化

	GPIO_InitStructure.Pin  = GPIO_Pin_7;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);//初始化


	GPIO_InitStructure.Pin  = GPIO_Pin_4|GPIO_Pin_5;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化

	GPIO_InitStructure.Pin  = GPIO_Pin_0|GPIO_Pin_1;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化

}


// 根据索引，返回列的状态值
u8 getCol(u8 index){
	if(index ==0) return COL1;
	else if(index ==1) return COL2;
	else if(index ==2) return COL3;
	else if(index ==3) return COL4;
	else return COL1;
}

// 根据索引，设置行的状态值
void setRow(u8 index){
	ROW1 = index ==0 ? 0 : 1;
	ROW2 = index ==1 ? 0 : 1;
	ROW3 = index ==2 ? 0 : 1;
	ROW4 = index ==3 ? 0 : 1;
}

u16 status = 0xFFFF;  // 1111 1111  1111 1111

//声明外部函数！
extern void handle_key_down(u8 row , u8 col);
extern void handle_key_up(u8 row , u8 col);


void MK_Scan(){
	u8 i , j ;

    for(i = 0 ; i < 4 ; i++){
		//1. 拉低对应行的状态
		setRow(i);

		//2. 判定是否有按下第一个按键
		for(j = 0 ; j < 4 ; j++){
			/*
					如果要判定第0行
						0-0 , 判定它的状态是否是0，起始就是判定二进制里面第0位是否是0 status & (1 << 0 ) ==0 
						0-1 , 判定它的状态是否是0，起始就是判定二进制里面第1位是否是0 status & (1 << 1 ) ==0 
						0-2 , 判定它的状态是否是0，起始就是判定二进制里面第2位是否是0 status & (1 << 2 ) ==0 
						0-3 , 判定它的状态是否是0，起始就是判定二进制里面第3位是否是0 status & (1 << 3 ) ==0 
					
					如果要判定第1行
						1-0 , 判定它的状态是否是0，起始就是判定二进制里面第4位是否是0 status & (1<<4) ==0 
						1-1 , 判定它的状态是否是0，起始就是判定二进制里面第5位是否是0 status & (1<<5) ==0 
						1-2 , 判定它的状态是否是0，起始就是判定二进制里面第6位是否是0 status & (1<<6) ==0 
						1-3 , 判定它的状态是否是0，起始就是判定二进制里面第7位是否是0 status & (1<<7) ==0 

					如果我要判定第 i 行的，第j列的按键                            status & (1 << (i*4 + j))==0
					
				*/
			if(getCol(j) == UP &&   IS_KEY_DOWN(status , i , j)){
				//printf("%d-%d :: up\n" , (int)i+1,(int)j+1);
				handle_key_up(i , j );
                
                SET_KEY_UP(status ,i ,j);
			}else if(getCol(j)  == DOWN  && IS_KEY_UP(status , i , j )){
				//printf("%d-%d :: down\n" ,(int)i+1, (int)j+1);
				handle_key_down(i , j );

                SET_KEY_DOWN(status ,i ,j);
			}
		}
	}

}


